﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;
using System.Collections;


namespace eCampus
{
    /// <summary>
    /// Formulario Consultar Mensaje
    /// </summary>
    public partial class FormMensajeConsultar : Form
    {
        /// <summary>
        /// variables
        /// </summary>
        ENMensaje en;

        bool isMensajesSeleccionados = false;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="usu">usuario</param>
        public FormMensajeConsultar(string usu)
        {
            en = new ENMensaje(usu);

            InitializeComponent();

            //Preselecciona los combobox
            cbBandejaOEnviados.SelectedIndex = 0;
            cbAccionesMasivas.SelectedIndex = 0;
            cbFiltro.SelectedIndex = 0;

            //Actualiza DataGridViez, al ser primera vez, se envía true
            ActualizaDataGrid(true);
        }

        /// <summary>
        /// Refresca la tabla
        /// </summary>
        /// <param name="primeraVez"></param>
        private void ActualizaDataGrid(bool primeraVez = false)
        {
            try
            {
                //Si hay una búsqueda activa se muestra tanto emisor como receptor
                if (btEliminarBusqueda.Visible)
                {
                    dgMensajes.DataSource = en.Buscar(tbBuscar.Text, cbFiltro.SelectedIndex);
                    dgMensajes.Columns["menEmisor"].Visible = true;
                    dgMensajes.Columns["menReceptor"].Visible = true;
                }
                //Si estamos en la bandeja de entrada se muestra el emisor
                else if (cbBandejaOEnviados.SelectedIndex == 0)
                {
                    dgMensajes.DataSource = en.BandejaEntrada();
                    dgMensajes.Columns["menEmisor"].Visible = true;
                    dgMensajes.Columns["menReceptor"].Visible = false;
                }
                //Si estamos en mensajes enviados muestra el receptor
                else if (cbBandejaOEnviados.SelectedIndex == 1)
                {
                    dgMensajes.DataSource = en.MensajesEnviados();
                    dgMensajes.Columns["menEmisor"].Visible = false;
                    dgMensajes.Columns["menReceptor"].Visible = true;
                }

                //Si es la primera vez que se pinta la tabla, formatea y crea las columnas
                if (primeraVez)
                {
                    dgMensajes.Columns["menId"].Visible = false;
                    dgMensajes.Columns["menReceptor"].Visible = false;
                    dgMensajes.Columns["menPropietario"].Visible = false;
                    dgMensajes.Columns["menMensaje"].Visible = true;
                    dgMensajes.Columns["menMensaje"].Width = 250;
                    dgMensajes.Columns["menArchivo"].Visible = false;
                    dgMensajes.Columns["menPuntuacion"].Visible = false;
                    dgMensajes.Columns["menLeido"].Visible = false;
                    dgMensajes.Columns["menAsunto"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    dgMensajes.Columns["menDate"].HeaderText = "Fecha";
                    dgMensajes.Columns["menEmisor"].HeaderText = "Enviado por";
                    dgMensajes.Columns["menReceptor"].HeaderText = "Enviado a";
                    dgMensajes.Columns["menAsunto"].HeaderText = "Asunto";
                    dgMensajes.Columns["menMensaje"].HeaderText = "Mensaje";


                    dgMensajes.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGoldenrodYellow;

                    //Añade columna eliminar
                    DataGridViewImageColumn ColEliminar = new DataGridViewImageColumn();
                    ColEliminar.Name = "elim";
                    ColEliminar.HeaderText = "";
                    ColEliminar.Image = eCampus.Properties.Resources.btBorrar;
                    ColEliminar.Width = 30;
                    dgMensajes.Columns.Add(ColEliminar);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error al cargar la tabla", "Error");
            }
        }

        /// <summary>
        /// Abre los mensajes enviados
        /// </summary>
        public void GoToEnviados()
        {
            cbBandejaOEnviados.SelectedIndex = 1;
            ActualizaDataGrid();
        }

        /// <summary>
        /// Abre los mensajes enviados
        /// </summary>
        public void GoToRecibidos()
        {
            cbBandejaOEnviados.SelectedIndex = 0;
            ActualizaDataGrid();
        }

        public void ContactarAdmin()
        {
            FormMensajeCrear n = new FormMensajeCrear(en.Receptor, true);
            n.ShowDialog();

            ActualizaDataGrid();
        }

        /// <summary>
        /// Invoca al formularo que crea un nuevo mensaje
        /// </summary>
        /// <param name="sender">btNuevo</param>
        /// <param name="e">Click</param>
        public void btNuevo_Click(object sender, EventArgs e)
        {
            FormMensajeCrear n = new FormMensajeCrear(en.Receptor);
            n.ShowDialog();

            ActualizaDataGrid();
        }
        
        /// <summary>
        /// Función para eliminar muchos mensajes
        /// </summary>
        private void EliminarMensajes()
        {
            ArrayList res = new ArrayList();

            //Recoge las id's de los mensajes a eliminar
            for (int i = 0; i < dgMensajes.Rows.Count; i++)
            {
                if (dgMensajes["check", i].Value != null && (bool)(dgMensajes["check", i].Value) == true)
                {
                    res.Add(int.Parse(dgMensajes["menId", i].Value.ToString()));
                }
            }

            if (MessageBox.Show("¿Desea eliminar permanentemente " + res.Count + " mensajes?", "Eliminar mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                try
                {
                    en.Eliminar(res);
                    ActualizaDataGrid();
                }
                catch (Exception)
                {
                    MessageBox.Show("Error al eliminar", "Error");
                }
            }
        }

        /// <summary>
        /// Función que marca como leídos los mensajes seleccionados
        /// </summary>
        private void MarcarLeido()
        {
            ArrayList res = new ArrayList();

            //Recoge las id's de los mensajes a marcar como leidos
            for (int i = 0; i < dgMensajes.Rows.Count; i++)
            {
                if (dgMensajes["check", i].Value != null && (bool)(dgMensajes["check", i].Value) == true)
                {
                    res.Add(int.Parse(dgMensajes["menId", i].Value.ToString()));
                }
            }

            try
            {
                en.MarcarLeido(res);
                ActualizaDataGrid();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al eliminar", "Error");
            }
        }

        /// <summary>
        /// Función que marca como no leídos los mensajes seleccionados
        /// </summary>
        private void MarcarNoLeido()
        {
            ArrayList res = new ArrayList();


            //Recoge las id's de los mensajes a marcar como leidos
            for (int i = 0; i < dgMensajes.Rows.Count; i++)
            {
                if (dgMensajes["check", i].Value != null && (bool)(dgMensajes["check", i].Value) == true)
                {
                    res.Add(int.Parse(dgMensajes["menId", i].Value.ToString()));
                }
            }

            try
            {
                en.MarcarNoLeido(res);
                ActualizaDataGrid();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al eliminar", "Error");
            }
        }

        /// <summary>
        /// Funciones al hacer click en una celda:
        /// eliminar, seleccionar, seleccionar todo y no seleccionar nada
        /// </summary>
        /// <param name="sender">dgMensajes</param>
        /// <param name="e">CellClick</param>
        private void dgMensajes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                //Eliminar mensaje
                if (e.ColumnIndex == dgMensajes.Columns["elim"].Index)
                {
                    if (MessageBox.Show("¿Desea eliminar permanentemente \"" + dgMensajes["menAsunto", e.RowIndex].Value.ToString() + "\"?", "Eliminar mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        try
                        {
                            en.Eliminar(int.Parse(dgMensajes["menId", e.RowIndex].Value.ToString()));
                            ActualizaDataGrid();
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("Error al eliminar", "Error");
                        }
                    }
                }
                //Seleccionar mensaje
                else if (e.ColumnIndex == dgMensajes.Columns["check"].Index)
                {
                    if (dgMensajes["check", e.RowIndex].Value == null)
                    {
                        dgMensajes["check", e.RowIndex].Value = true;
                    }
                    else
                    {
                        dgMensajes["check", e.RowIndex].Value = !(bool)(dgMensajes["check", e.RowIndex].Value);
                    }
                }
                //Carga una conversación
                else
                {
                    ENMensaje enaux = null;

                    //Carga la conversación si estamos en la bandeja de entrada
                    if (cbBandejaOEnviados.SelectedIndex == 1)
                    {
                        enaux = new ENMensaje(dgMensajes["menReceptor", e.RowIndex].Value.ToString(),
                                              dgMensajes["menEmisor", e.RowIndex].Value.ToString());

                        enaux.Asunto = dgMensajes["menAsunto", e.RowIndex].Value.ToString();
                    }
                    //Si estamos en mensajes enviados, se envían receptor y emisor invertidos
                    else
                    {
                        enaux = new ENMensaje(dgMensajes["menEmisor", e.RowIndex].Value.ToString(),
                                              dgMensajes["menReceptor", e.RowIndex].Value.ToString());

                        enaux.Asunto = dgMensajes["menAsunto", e.RowIndex].Value.ToString();
                    }
                    LineaMensaje l = new LineaMensaje(enaux);
                    l.ShowDialog();

                    ActualizaDataGrid();
                }
            }
            //Si se hace click en la celda de la primera columna de la cabecera,
            //selecciona o deselecciona todos los mensaje
            else if (e.RowIndex == -1 && e.ColumnIndex == 0)
            {
                if (!isMensajesSeleccionados)
                {
                    SeleccionarTodo();
                }
                else
                {
                    DeseleccionarTodo();
                }
            }
        }
        
        /// <summary>
        /// Si se cambia de bandeja de entrada a mensajes enviados, o viceversa refresca la tabla
        /// </summary>
        /// <param name="sender">cbBandejaOEnviados</param>
        /// <param name="e">SelectedIndexChanged</param>
        private void cbBandejaOEnviados_SelectedIndexChanged(object sender, EventArgs e)
        {
            ActualizaDataGrid();
        }

        /// <summary>
        /// Formateo de celdas: Marca los mensajes no leídos
        /// </summary>
        /// <param name="sender">dgMensaje</param>
        /// <param name="e">CellFormatting</param>
        private void dgMensajes_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.Value != null)
            {
                if (dgMensajes["menLeido", e.RowIndex].Value.ToString() == "0")
                {
                    e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold);
                }
            }
        }

        /// <summary>
        /// Selecciona todos los mensajes de la tabla (marca la casilla como checked)
        /// </summary>
        private void SeleccionarTodo()
        {
            for (int i = 0; i < dgMensajes.Rows.Count; i++)
            {
                dgMensajes["check", i].Value = true;
            }
            isMensajesSeleccionados = true;
        }

        /// <summary>
        /// Elimina la selección de todos los mensajes (marca la casilla como unchequed)
        /// </summary>
        private void DeseleccionarTodo()
        {
            for (int i = 0; i < dgMensajes.Rows.Count; i++)
            {
                dgMensajes["check", i].Value = false;
            }
            isMensajesSeleccionados = false;
        }

        /// <summary>
        /// Cuando el combobox de acciones cambia puede: 
        /// EliminarMensajes, MarcarLeido,MarcarNoLeido, SeleccionarTodo, DeseleccionarTodo
        /// </summary>
        /// <param name="sender">comboBox1</param>
        /// <param name="e">SelectedIndexChanged</param>
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (cbAccionesMasivas.SelectedIndex)
            {
                case 1:
                    EliminarMensajes();
                    break;
                case 2:
                    MarcarLeido();
                    break;
                case 3:
                    MarcarNoLeido();
                    break;
                case 4:
                    SeleccionarTodo();
                    break;
                case 5:
                    DeseleccionarTodo();
                    break;
            }
            //Reestablece
            cbAccionesMasivas.SelectedIndex = 0;
        }

        /// <summary>
        /// Inicia nueva búsqueda
        /// </summary>
        /// <param name="sender">btBusquedaSimple</param>
        /// <param name="e">Click</param>
        private void btBusquedaSimple_Click(object sender, EventArgs e)
        {
            btEliminarBusqueda.Visible = true;
            ActualizaDataGrid();
        }

        /// <summary>
        /// Elimina la búsqueda
        /// </summary>
        /// <param name="sender">button1</param>
        /// <param name="e">Click</param>
        private void button1_Click(object sender, EventArgs e)
        {
            btEliminarBusqueda.Visible = false;
            ActualizaDataGrid();
        }

        private void dgMensajes_SelectionChanged(object sender, EventArgs e)
        {
            dgMensajes.ClearSelection();
        }

        private void FormMensajeConsultar_Load(object sender, EventArgs e)
        {

        }

        private void FormMensajeConsultar_Load_1(object sender, EventArgs e)
        {

        }
    }
}
